#pragma once

#include "instructions/base/instructions.h"
#include "rtda/frame.h"


namespace jvm {
    namespace instructions {

        class AALOAD : public NoOperandsInstruction {
        public:
            void execute(std::shared_ptr<rtda::Frame> pframe) override;
        };

        class BALOAD : public NoOperandsInstruction {
        public:
            void execute(std::shared_ptr<rtda::Frame> pframe) override;
        };

        class CALOAD : public NoOperandsInstruction {
        public:
            void execute(std::shared_ptr<rtda::Frame> pframe) override;
        };

        class DALOAD : public NoOperandsInstruction {
        public:
            void execute(std::shared_ptr<rtda::Frame> pframe) override;
        };

        class FALOAD : public NoOperandsInstruction {
        public:
            void execute(std::shared_ptr<rtda::Frame> pframe) override;
        };

        class IALOAD : public NoOperandsInstruction {
        public:
            void execute(std::shared_ptr<rtda::Frame> pframe) override;
        };

        class LALOAD : public NoOperandsInstruction {
        public:
            void execute(std::shared_ptr<rtda::Frame> pframe) override;
        };

        class SALOAD : public NoOperandsInstruction {
        public:
            void execute(std::shared_ptr<rtda::Frame> pframe) override;
        };

        //namespace utils {
        //    void checkNotNil(std::shared_ptr<heap::Object> ref);
        //    void checkIndex(size_t arrLen, int32_t index);
        //} // namespace utils

    } // namespace instructions
}// namespace jvm